package com.filepublic.demo.server.aop;

import com.filepublic.demo.common.annotations.PropertyNotNull;
import com.filepublic.demo.common.constant.ExceptionConstant;
import com.filepublic.demo.common.exception.BaseLogicException;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

import java.lang.reflect.Field;

@Aspect
@Component
@Slf4j
public class PropertyCheck {

    @Pointcut("execution(* com.filepublic.demo.server.controller.*.*(..)) && @annotation(com.filepublic.demo.common.annotations.PropertyNotNull)")
    public void pointCut(){}
    @Before("pointCut()")
    public void afterCheck(JoinPoint joinPoint) throws IllegalAccessException {
        // 获取传入的属性
        Object[] args = joinPoint.getArgs();

        //遍历属性，检查是否为null或者“”
        for(Object arg : args){

            //当属性为null，或者为“”
            if(arg == null || arg.equals("")){
                log.error("对象为null");
                throw new BaseLogicException(ExceptionConstant.PROPERTY_NULL);
            }

            //判断该对象的下属属性
            Class<?> clazz = arg.getClass();
            // 如果是基本类型、String或Number的子类（包括Integer等），则不进行属性检查
            if (clazz.isPrimitive() || clazz.isAssignableFrom(String.class) || clazz.isAssignableFrom(Number.class)) {
                continue;
            }

            Field[] fields = clazz.getDeclaredFields();
            for (Field field : fields) {
                field.setAccessible(true); // 允许访问私有字段
                Object value = field.get(arg);

                if (value == null || value.equals("")) {
                    log.error("参数为null");
                    throw new BaseLogicException(ExceptionConstant.PROPERTY_NULL);
                }
            }
        }
        log.info("属性检查完成");
    }
}
